<?php
class Logger{
    const DEBUG = 'DEBUG';
    const INFO = 'INFO';
    const WARNING = 'WARNING';
    const ERROR = 'ERROR';
    const CRITICAL = 'CRITICAL';

    /**
     * 记录调试级别的日志
     *
     * @param mixed $content 日志内容
     * @return bool 是否成功写入日志
     */
    public static function debug($title='', $content = null) {
        return self::setLog(self::DEBUG, $title, $content);
    }

    /**
     * 记录信息级别的日志
     *
     * @param mixed|null $content 日志内容
     * @return bool 是否成功写入日志
     */
    public static function info($title='', mixed $content = null) {
        return self::setLog(self::INFO, $title, $content);
    }

    /**
     * 记录警告级别的日志
     *
     * @param mixed $content 日志内容
     * @return bool 是否成功写入日志
     */
    public static function warning($title='', $content = null) {
        return self::setLog(self::WARNING, $title, $content);
    }

    /**
     * 记录错误级别的日志
     *
     * @param mixed $content 日志内容
     * @return bool 是否成功写入日志
     */
    public static function error($title='', $content = null) {
        return self::setLog(self::ERROR, $title, $content);
    }

    /**
     * 记录严重错误级别的日志
     *
     * @param mixed $content 日志内容
     * @return bool 是否成功写入日志
     */
    public static function critical($title='', $content = null) {
        return self::setLog(self::CRITICAL, $title, $content);
    }

    /**
     * 写入日志
     *
     * @param string $level 日志级别
     * @param mixed $content 日志内容
     * @return bool 是否成功写入日志
     */
    protected static function setLog($level = 'INFO', $title='', $content = null) {
        $logPath = './runtime/log/'.date("Y/m/d/");
        if(!is_dir($logPath)) {
            mkdir($logPath,755,true);
        }
        $logFileName = date('H').'_'.$level;
        // 获取调用栈信息
        $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
        // 获取调用该日志记录方法的文件路径和行号
        // 获取调用该日志记录方法的文件路径和行号
        $callerFile = $trace[1]['file'] ?? 'UNKNOWN';
        $callerLine = $trace[1]['line'] ?? 'UNKNOWN';
        $logContent = sprintf(
            '[%s] %s %s %s %s %s %s:  %s' . PHP_EOL,
            $level,
            date('Y/m/d H:i:s'),
            $_SERVER['REMOTE_ADDR'] ?? 'UNKNOWN',
            $_SERVER['REQUEST_METHOD'] ?? 'UNKNOWN',
            $callerFile,
            $callerLine,
            $title,
            is_array($content) || is_object($content) ? json_encode($content,JSON_UNESCAPED_UNICODE) : $content
        );

        $logFilePath = $logPath . $logFileName . '.log';
        try {
            return file_put_contents($logFilePath,$logContent.PHP_EOL,FILE_APPEND);
        }catch (\Throwable $e) {
            // 处理写入日志文件时的异常
            error_log('日志文件记录错误Error writing to log file: ' . $e->getMessage());
            return false;
        }
    }
}